﻿using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;

namespace 任务管理器
{

    internal class 配置项
    {
        #region 引入INI读取函数
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
        [DllImport("kernel32")]
        private static extern int WritePrivateProfileString(string lpApplicationName, string lpKeyName, string lpString, string lpFileName);
        #endregion
        #region INI操作方法
        /// <summary>
        ///读取一个配置项，如果这个配置项中的值不存在返回一个默认值
        /// </summary>
        /// <param name="配置节名">配置节名</param>
        /// <param name="配置项名">配置项名</param>
        /// <param name="默认返回">如果这个配置项中的值不存在返回一个默认值</param>
        /// <param name="配置项文件">指定一个配置项的文件路径</param>
        /// <returns></returns>
        public string 读取(string 配置项文件, string 配置节名, string 配置项名, string 默认返回)
        {
            if (File.Exists(配置项文件))
            {
                StringBuilder temp = new StringBuilder(1024);
                GetPrivateProfileString(配置节名, 配置项名, 默认返回, temp, 1024, 配置项文件);
                return temp.ToString();
            }
            else
            {
                return 默认返回;
            }
        }
        /// <summary>
        /// 写配置项，返回True或者Flase
        /// </summary>
        /// <param name="配置项路径">输入目标文件路径</param>
        /// <param name="配置节名">配置节名 [ ]内的文字</param>
        /// <param name="配置项名">配置项名 = 前的文字</param>
        /// <param name="值">配置值 = 后的文字</param>
        /// <returns></returns>
        public bool 写入(string 配置项路径, string 配置节名, string 配置项名, string 值)
        {
            var pat = System.IO.Path.GetDirectoryName(配置项路径);
            if (Directory.Exists(pat) == false)
            {
                Directory.CreateDirectory(pat);
            }
            if (File.Exists(配置项路径) == false)
            {
                File.Create(配置项路径).Close();
            }
            long OpStation = WritePrivateProfileString(配置节名, 配置项名, 值, 配置项路径);
            if (OpStation == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        #endregion
    }
    internal class 正则
    {
        /// <summary>
        /// 返回正则符合正则表达式，并且匹配后的子文本项
        /// </summary>
        /// <param name="一段文本">原文本</param>
        /// <param name="正则表达式">正则表达式</param>
        /// <param name="匹配">匹配索引</param>
        /// <param name="子匹配">子匹配索引</param>
        /// <returns>返回0为匹配空</returns>
        public string 正则子匹配文本(string 一段文本, string 正则表达式, int 匹配, int 子匹配)

        {

            Regex 匹配器 = new Regex(正则表达式);
            var 匹配集 = 匹配器.Matches(一段文本);
            if (匹配集.Count == 0)
            { return "Error"; }
            return 匹配集[匹配].Groups[子匹配 + 1].Value;

        }

        /// <summary>
        /// 返回正则表达式的文本子匹配数量
        /// </summary>
        /// <param name="一段文本">输入一段文本</param>
        /// <param name="正则表达式">输入一个正则表达式</param>
        /// <returns></returns>
        public int 正则子匹配数量(string 一段文本, string 正则表达式, int 匹配)

        {

            Regex 匹配器 = new Regex(正则表达式);
            var 匹配集 = 匹配器.Matches(一段文本);
            return 匹配集[匹配].Groups.Count;


        }


        /// <summary>
        /// 返回正则通过正则匹配的文本
        /// </summary>
        /// <param name="一段文本">输入一段文本</param>
        /// <param name="正则表达式">输入一个正则表达式</param>
        /// <param name="匹配索引">正则匹配索引</param>
        /// <returns></returns>
        public string 正则匹配文本(string 一段文本, string 正则表达式, int 匹配索引)

        {
            //正则创建
            var a = Regex.Matches(一段文本, 正则表达式);
            //表示获取第一个正则匹配索引
            return a[匹配索引].ToString();
        }


        /// <summary>
        /// 返回正则匹配的数量（次数）
        /// </summary>
        /// <param name="一段文本">输入一段文本</param>
        /// <param name="正则表达式">输入一个正则表达式</param>
        /// <returns></returns>
        public int 正则匹配数量(string 一段文本, string 正则表达式)

        {
            //正则创建
            var a = Regex.Matches(一段文本, 正则表达式);
            //正则匹配数量
            return a.Count;

        }
    }
    internal class 文件
    {
        /// <summary>
        /// 快速读取一个文本文档
        /// </summary>
        /// <param name="文件路径">输入文件的路径</param>
        /// <returns></returns>
        public string 读入文件_快速(string 文件路径)
        {

            return File.ReadAllText(文件路径);
        }

        /// <summary>
        /// 快速读取一个文本文档
        /// </summary>
        /// <param name="文件路径">输入文件的路径</param>
        /// <returns></returns>
        public string 读入文件_快速(string 文件路径, Encoding 编码)
        {
            return File.ReadAllText(文件路径, 编码);
        }

        /// <summary>
        /// 向一个文件写入数据
        /// </summary>
        /// <param name="文件路径">输入写入文件的目标路径</param>
        /// <param name="写入内容">输入要向文件写入的内容</param>
        public void 写入文件(String 文件路径, string 写入内容)
        {
            FileStream fs = new FileStream(文件路径, FileMode.Create);
            //获得字节数组
            byte[] data = System.Text.Encoding.Default.GetBytes(写入内容);
            //开始写入
            fs.Write(data, 0, data.Length);
            //清空缓冲区、关闭流
            fs.Flush();
            fs.Close();
        }

        /// <summary>
        /// 向一个文件写入数据，高级模式
        /// </summary>
        /// <param name="文件名">输入写入文件的目标路径</param>
        /// <param name="文件内容">输入要向文件写入的内容</param>
        /// <param name="是否追加写入">是否是向文件追加内容</param>
        /// <param name="编码">应用一个编码进行写入</param>
        /// <returns></returns>
        public bool 写入文件(string 文件名, string 文件内容, bool 是否追加写入, Encoding 编码)
        {
            try
            {
                StreamWriter sw = new StreamWriter(文件名, 是否追加写入, 编码);
                sw.WriteLine(文件内容);
                sw.Close();
                return true;
            }
            catch { return false; }
        }

        /// <summary>
        /// 创建一个新空白文件，若文件本身已经存在，则覆盖文件
        /// </summary>
        /// <param name="文件路径">输入要创建文件的路径</param>
        /// <returns></returns>
        public void 新建文件(string 文件路径)
        {
            File.Create(文件路径);
        }

    }
    internal class 控制台
    {
        public string 命令行运行(string 命令)

        {
            string strInput = 命令;
            Process p = new Process();
            //设置要启动的应用程序
            p.StartInfo.FileName = "cmd.exe";
            //是否使用操作系统shell启动
            p.StartInfo.UseShellExecute = false;
            // 接受来自调用程序的输入信息
            p.StartInfo.RedirectStandardInput = true;
            //输出信息
            p.StartInfo.RedirectStandardOutput = true;
            // 输出错误
            p.StartInfo.RedirectStandardError = true;
            //不显示程序窗口
            p.StartInfo.CreateNoWindow = true;
            //启动程序
            p.Start();

            //向cmd窗口发送输入信息
            p.StandardInput.WriteLine(strInput + "&exit");

            p.StandardInput.AutoFlush = true;

            //获取输出信息
            string strOuput = p.StandardOutput.ReadToEnd();
            //等待程序执行完退出进程
            p.WaitForExit();
            p.Close();

            return strOuput;




        }

    }
    internal class 时间辅助
    {
        public TimeSpan 计算时间间隔(DateTime 开始时刻, DateTime 结束时刻)
        {
            TimeSpan 开始时间 = new TimeSpan(开始时刻.Ticks);
            TimeSpan 结束时间 = new TimeSpan(结束时刻.Ticks);
            TimeSpan ts = 开始时间.Subtract(结束时间).Duration();
            return ts;

        }
        public double 计算时间百分比(DateTime 开始时刻, DateTime 结束时刻)
        {
            var 剩余时间 = 计算时间间隔(DateTime.Now, 结束时刻);
            var 最初时间 = 开始时刻;
            double 原秒数 = 计算时间间隔(结束时刻, 最初时间).TotalSeconds;
            double 现秒数 = 剩余时间.TotalSeconds;
            double 分之数 = Math.Round(现秒数 / 原秒数 * 100, 1);
            return 分之数;
        }

    }

}
